package com.mmtech.edb.data.util;

import org.apache.commons.lang3.text.StrSubstitutor;

import java.util.Map;

/**
 * 字符串解析
 *
 * @author wuchong
 * @since 2019-04-28 11:27
 **/
public final class PlaceholderUtil {


    private PlaceholderUtil() {
    }

    /**
     * 替换占位符
     *
     * @param source                        源内容
     * @param parameter                     占位符参数
     * @param prefix                        占位符前缀 例如:${
     * @param suffix                        占位符后缀 例如:}
     * @param enableSubstitutionInVariables 是否在变量名称中进行替换 例如:${system-${版本}}
     *                                      <p>
     *                                      转义符默认为'$'。如果这个字符放在一个变量引用之前，这个引用将被忽略，不会被替换 如$${a}将直接输出${a}
     * @return
     */
    public static String replace(String source, Map<String, String> parameter, String prefix, String suffix, boolean enableSubstitutionInVariables) {
        //StrSubstitutor不是线程安全的类
        StrSubstitutor strSubstitutor = new StrSubstitutor(parameter, prefix, suffix);
        //是否在变量名称中进行替换
        strSubstitutor.setEnableSubstitutionInVariables(enableSubstitutionInVariables);
        return strSubstitutor.replace(source);
    }

    /**
     * 替换占位符
     *
     * @param source    源内容
     * @param parameter 占位符参数
     *                  <p>
     *                  转义符默认为'$'。如果这个字符放在一个变量引用之前，这个引用将被忽略，不会被替换 如$${a}将直接输出${a}
     * @return
     */
    public static String replace(String source, Map<String, String> parameter) {
        //StrSubstitutor不是线程安全的类
        StrSubstitutor strSubstitutor = new StrSubstitutor(parameter);
        return strSubstitutor.replace(source);
    }

    /**
     * 替换占位符
     *
     * @param source    源内容
     * @param parameter 占位符参数
     * @param prefix    占位符前缀 例如:${
     * @param suffix    占位符后缀 例如:}
     *                  <p>
     *                  转义符默认为'$'。如果这个字符放在一个变量引用之前，这个引用将被忽略，不会被替换 如$${a}将直接输出${a}
     * @return
     */
    public static String replace(String source, Map<String, String> parameter, String prefix, String suffix) {
        return replace(source, parameter, prefix, suffix, true);
    }
}
